package dao;

import java.util.List;
import model.Usuario;
import org.hibernate.Query;
import org.hibernate.SQLQuery;
import org.hibernate.Session;
import util.HibernateUtil;

/**
 *
 * @author Lucas S Bueno
 */
public class UsuarioDAO implements BasicDAOInterface<Usuario> {

   @Override
   public boolean salvar(Usuario obj) {
      Session session = HibernateUtil.getSessionFactory().openSession();
      session.beginTransaction();

      try {
         session.save(obj);
         session.getTransaction().commit();
         session.disconnect();
      } catch (Exception e) {
         System.err.println("ERRO AO SALVAR USUARIO!\n" + e.getMessage());
         return false;
      }

      return true;
   }

   @Override
   public List<Usuario> recuperar() {
      Session session = HibernateUtil.getSessionFactory().openSession();
      session.beginTransaction();
      List<Usuario> usuarios;

      try {
         usuarios = session.createQuery("from Usuario").list();
         session.getTransaction().commit();
      } catch (Exception e) {
         System.err.println("ERRO AO RECUPERAR USUARIOS!\n" + e.getMessage());
         return null;
      }

      return usuarios;
   }

   @Override
   public Usuario recuperar(int id) {
      Session session = HibernateUtil.getSessionFactory().openSession();
      session.beginTransaction();
      Usuario usuario;

      try {
         Query consulta = session.createQuery("from Usuario as user where user.id = :id");
         consulta.setInteger("id", id);
         usuario = (Usuario) consulta.uniqueResult();
         session.getTransaction().commit();
      } catch (Exception e) {
         System.err.println("ERRO AO RECUPERAR USUARIO!\n" + e.getMessage());
         return null;
      }

      return usuario;
   }
   
   public Usuario recuperar(String email, String senha) {
      Session session = HibernateUtil.getSessionFactory().openSession();
      session.beginTransaction();
      List<Usuario> usuarios;

      try {
         Query consulta = session.createQuery("from Usuario as user where user.email = :email and user.senha = :senha");
         consulta.setString("email", email);
         consulta.setString("senha", senha);
         usuarios = consulta.list();
         session.getTransaction().commit();
         
         if (usuarios.isEmpty()) {
            return null;
         } else {
            return usuarios.get(0);
         }
      } catch (Exception e) {
         System.err.println("ERRO AO RECUPERAR USUARIOS!\n" + e.getMessage());
         return null;
      }      
   }

   @Override
   public boolean atualizar(Usuario obj) {
      Session session = HibernateUtil.getSessionFactory().openSession();
      session.beginTransaction();

      try {
         session.update(obj);
         session.getTransaction().commit();
         session.disconnect();
      } catch (Exception e) {
         System.err.println("ERRO AO ATUALIZAR USUARIO!\n" + e.getMessage());
         return false;
      }
      
      return true;
   }

   @Override
   public boolean deletar(Usuario obj) {
      Session session = HibernateUtil.getSessionFactory().openSession();
      session.beginTransaction();
      
      try {
         session.delete(obj);
         session.getTransaction().commit();
         session.disconnect();
      } catch (Exception e) {
         System.err.println("ERRO AO DELETAR USUARIO!\n" + e.getMessage());
         return false;
      }
      
      return true;
   }
   
   public int maxId() {
      Session session = HibernateUtil.getSessionFactory().openSession();
      session.beginTransaction();
      
      Integer resultado;
      try {
         SQLQuery consulta = session.createSQLQuery("select max(id) from usuario");         
         resultado = (Integer) consulta.uniqueResult();         
         session.getTransaction().commit();
      } catch (Exception e) {
         System.err.println("ERRO AO RECUPERAR USUARIO!\n" + e.getMessage());
         return 0;
      }

      return resultado.intValue();
   }
}
